本篇文章將延續昨天的 Collector 元件介紹,探討將 Collector 部署到生產環境時的幾個策略。
根據官方文件,Collector 的部署可分為三種類型,分別是 No Collector、Agent和Gateway,各個類型有其適用場景及優缺點。

顧名思義,就是不使用 Collector!OpenTelemetry 可以單純使用 SDK 將 telemetry 送到儲存後端。
在這種模式下,應用程式直接透過 OpenTelemetry SDK 將 traces、metrics 和 logs 發送到觀測性後端,如 Jaeger、Prometheus 或其他雲端服務。
優點:
缺點:
因此,No Collector 的部署通常被建議用於開發或測試環境。畢竟當需求變動時,No Collector 相較起來還是比較沒有彈性的。

Agent 模式是將 Collector 部署在接近應用程式的位置,例如 Kubernetes中的 sidecar(用以觀察 Pod)或者 DaemonSet(用以觀察各個節點)。
優點:
缺點:

Gateway 模式採用集中式架構,將 Collector 部署為閘道服務,處理來自多個來源的 telemetry 資料。
優點:
缺點:
由於我在閱讀這兩個部署方式時,對這兩者間的差異有些搞混,所以在此比較一下這兩者的不同。
| 比較項目 | Agent 模式 | Gateway 模式 | 
|---|---|---|
| 部署位置 | 應用程式本地(同節點/Pod) | 集中式服務 | 
| 資料傳輸 | 本地處理,無網路延遲 | 透過網路傳輸到遠端 | 
| 部署密度 | 每個節點/Pod 一個 | 每個叢集/區域一個或多個 | 
| 故障影響範圍 | 僅影響單一節點 | 可能影響整個叢集 | 
| 擴展方式 | 隨應用程式線性擴展 | 可獨立擴展處理能力 | 
| 適用場景 | 低延遲、故障隔離需求 | 集中處理、統一策略需求 | 
簡單來說,Agent 在本地處理資料,Gateway 透過網路集中處理資料。
不過,這兩種模式並非互斥,實務上經常混合使用。在官方文件中有個很好的例子:
以 Agent 來說:
以 Gateway 來說:
因此,像這樣 Agent 和 Gateway 混合使用的架構分工通常如下:
這種架構既滿足了技術需求,也實現了效能和管理的最佳平衡。
講完三種部署理論後,讓我們在本地快速啟動一個 Collector,確認它能夠接收並輸出資料吧。
receivers:
  otlp:
    protocols:
      grpc:
      http:
exporters:
  debug:
    verbosity: detailed
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [debug]
    metrics:
      receivers: [otlp]
      exporters: [debug]
這個設定讓我們:
官方支援使用 Container 或者二進位檔的方式執行,這邊我選用 Container 的方式
docker run --rm -p 4317:4317 -p 4318:4318 \
  -v $(pwd)/otel-config.yaml:/config.yaml \
  otel/opentelemetry-collector:latest \
  --config /config.yaml
觀察 container log,會看到已經成功啟動 gRPC 和 HTTP server
開啟另一個終端機視窗,使用 curl 手動送一筆 OTLP 格式的 metrics 到 http endpoint。
編按:其實,若我們使用 SDK,就不需要手動組合 OTLP 格式的資料了,這我們會在明天的章節進行介紹。
curl -X POST -v http://127.0.0.1:4318/v1/metrics \
  -H "Content-Type: application/json" \
  -d '{
    "resourceMetrics": [{
      "resource": {
        "attributes": [{
          "key": "service.name",
          "value": {"stringValue": "my-service"}
        }]
      },
      "scopeMetrics": [{
        "metrics": [{
          "name": "http_requests_total",
          "unit": "1",
          "sum": {
            "dataPoints": [{
              "startTimeUnixNano": "1634000000000000000",
              "timeUnixNano": "1634000001000000000",
              "asInt": "100"
            }]
          }
        }]
      }]
    }]
  }'
如果成功,你應該會在 Collector Container 中看到 debug 輸出顯示收到的 metrics 資料。
今天探討了 Collector 常用的三種部署模式。明天,我們將介紹 OpenTelemetry 的 API 與 SDK,來了解要如何從應用程式發送 OTLP 資料。
ControlTheory - OpenTelemetry Collector Deployment Patterns: A Guide
OpenTelemetry Docs - Deployment
OpenTelemetry Docs - Install the Collector